Skip to content

Enable ICF on Linux#129762

Merged
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64
Jul 3, 2026
Merged

Enable ICF on Linux#129762
jkotas merged 7 commits into
dotnet:mainfrom
MichalPetryka:patch-64

Conversation

@MichalPetryka

@MichalPetryka MichalPetryka commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

CI is green and it saves on average 2% in size.

Opening to see CI results and size diffs
@MichalPetryka

Copy link
Copy Markdown
Contributor Author

@am11 Since I think you worked in this area the most, what do you think about this? It seems that the GCC build job failed cause ld does not support the flag.

Do the official builds use lld instead? If not, it probably doesn't make sense to do any checking for linker here.

Also, it seems like NativeAOT doesn't use the flags from here.

Comment thread eng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

@MichalPetryka

Copy link
Copy Markdown
Contributor Author

@MichalStrehovsky, experimented with it earlier. We may need changes from #87045.

My intent here was to only enable it for native code in the runtime, I'd leave the handling of NAOT outputs to @MichalStrehovsky.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

@MichalPetryka

Copy link
Copy Markdown
Contributor Author

Do you see any size difference before/after on linux?

$ ./build.sh clr+libs -c Release
$ find artifacts/bin/coreclr/linux.x64.Release -name '*.so*' -exec du -sh {} \;

I currently do not have a Linux machine on hand to test it, that's why I wanted to see how it impacts rt-sz.

@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member
Before (bytes) After (bytes) Diff (bytes) Diff % Path
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so
1425720 1295560 -130160 -9.13% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so
1765712 1723664 -42048 -2.38% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so
3542448 3529920 -12528 -0.35% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so
64148184 64237208 +89024 +0.14% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordaccore.so.dbg
648744 540616 -108128 -16.67% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so
4085928 4140104 +54176 +1.33% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so.dbg
756904 745544 -11360 -1.50% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgcexp.so
19504344 19491816 -12528 -0.06% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrjit.so.dbg
13660760 13661672 +912 +0.01% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libmscordbi.so.dbg
5819656 5801704 -17952 -0.31% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so.dbg
5307896 5216440 -91456 -1.72% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so
714296 696344 -17952 -2.51% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libclrgc.so
125775536 125815144 +39608 +0.03% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclr.so.dbg
1636728 1594136 -42592 -2.60% artifacts/bin/coreclr/linux.arm64.Release/sharedFramework/libcoreclrtraceptprovider.so.dbg
1425720 1295560 -130160 -9.13% artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so
46593576 46598952 +5376 +0.01% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so.dbg
1765712 1723664 -42048 -2.38% artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so
4252864 4284640 +31776 +0.75% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so.dbg
4190536 4189608 -928 -0.02% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/crossgen2-published/libclrjit_universal_wasm_arm64.so
3542448 3529920 -12528 -0.35% artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so
48364656 48437168 +72512 +0.15% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm64_arm64.so.dbg
64148184 64237208 +89024 +0.14% artifacts/bin/coreclr/linux.arm64.Release/libmscordaccore.so.dbg
319464 318312 -1152 -0.36% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so
648744 540616 -108128 -16.67% artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so
4085928 4140104 +54176 +1.33% artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so.dbg
46724656 46794416 +69760 +0.15% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so.dbg
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so
756904 745544 -11360 -1.50% artifacts/bin/coreclr/linux.arm64.Release/libclrgcexp.so
19504344 19491816 -12528 -0.06% artifacts/bin/coreclr/linux.arm64.Release/libclrjit.so.dbg
3971744 3970592 -1152 -0.03% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-simple.so.dbg
13660760 13661672 +912 +0.01% artifacts/bin/coreclr/linux.arm64.Release/libmscordbi.so.dbg
5819656 5801704 -17952 -0.31% artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so.dbg
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_unix_x64_arm64.so
38333424 38348496 +15072 +0.04% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_arm_arm64.so.dbg
46541744 46547728 +5984 +0.01% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_win_x86_arm64.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/crossgen2/libclrjit_universal_wasm_arm64.so
352648 351720 -928 -0.26% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-counter.so
5307896 5216440 -91456 -1.72% artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so
15953352 15953352 +0 +0.00% artifacts/bin/coreclr/linux.arm64.Release/R2RDump/libcoredistools.so
714296 696344 -17952 -2.51% artifacts/bin/coreclr/linux.arm64.Release/libclrgc.so
382832 349072 -33760 -8.82% artifacts/bin/coreclr/linux.arm64.Release/libsuperpmi-shim-collector.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so
278832 278752 -80 -0.03% artifacts/bin/coreclr/linux.arm64.Release/libjitinterface_arm64.so.dbg
125775536 125815144 +39608 +0.03% artifacts/bin/coreclr/linux.arm64.Release/libcoreclr.so.dbg
316056 316056 +0 +0.00% artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++abi.so.1
1469280 1469280 +0 +0.00% artifacts/bin/coreclr/linux.arm64.Release/SuperFileCheck/runtimes/linux-arm64/native/libc++.so.1
1636728 1594136 -42592 -2.60% artifacts/bin/coreclr/linux.arm64.Release/libcoreclrtraceptprovider.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/arm64/crossgen2/libclrjit_universal_wasm_arm64.so
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/arm64/ilc/libclrjit_universal_wasm_arm64.so
38873968 38950512 +76544 +0.20% artifacts/bin/coreclr/linux.arm64.Release/libclrjit_universal_wasm_arm64.so.dbg
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/ilc-published/libclrjit_universal_wasm_arm64.so
2804824 2746264 -58560 -2.09% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm64_arm64.so
2762576 2703024 -59552 -2.16% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x86_arm64.so
2117088 2066624 -50464 -2.38% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_arm_arm64.so
49392 49312 -80 -0.16% artifacts/bin/coreclr/linux.arm64.Release/ilc/libjitinterface_arm64.so
2849224 2789064 -60160 -2.11% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_win_x64_arm64.so
2870784 2809472 -61312 -2.14% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_unix_x64_arm64.so
2027688 1973160 -54528 -2.69% artifacts/bin/coreclr/linux.arm64.Release/ilc/libclrjit_universal_wasm_arm64.so
106664 103208 -3456 -3.24% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so
3625816 3622568 -3248 -0.09% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so.dbg
42088 42088 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so.dbg
14064 14064 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Ports.Native.so
574672 573520 -1152 -0.20% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so.dbg
1369216 1365968 -3248 -0.24% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.IO.Compression.Native.so
238032 238032 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so.dbg
395408 391952 -3456 -0.87% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Native.so.dbg
237544 236392 -1152 -0.48% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Security.Cryptography.Native.OpenSsl.so
64832 64832 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Globalization.Native.so
42344 42344 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so.dbg
15280 15280 +0 +0.00% artifacts/bin/native/net11.0-linux-Release-arm64/libSystem.Net.Security.Native.so
909602336 906807088 -2795248 -0.31% TOTAL

@MichalPetryka

Copy link
Copy Markdown
Contributor Author

@am11 Can you show the total without .dbg files?

Also, it seems like emscripten doesn't support icf even with lld, what's the proper condition for excluding that?

Comment thread eng/native/configurecompiler.cmake Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

@am11 Can you show the total without .dbg files?

| 157295704 | 154012152 | -3283552 | -2.09% | TOTAL |

@MichalPetryka MichalPetryka marked this pull request as ready for review June 24, 2026 09:22
@am11

am11 commented Jun 24, 2026

Copy link
Copy Markdown
Member

captured befroe.md and after.md with this:

echo "| Size (human) | Size (bytes) | Path |"; find artifacts/bin/coreclr/linux.arm64.Release artifacts/bin/native/net11.0-linux-Release-arm64 -name '*.so*' | xargs -I{} bash -c 'echo "| $(du -sh "$0" | cut -f1) | $(du -sb "$0" | cut -f1) | $0 |"' {}

then asked AI to compute deltas (which used python script).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

@AndyAyersMS

Copy link
Copy Markdown
Member

/azp run runtime-coreclr outerloop, runtime-extra-platforms

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 2 pipeline(s).

@MichalPetryka

Copy link
Copy Markdown
Contributor Author

Failures all unrelated, either non Linux or networking errors.

@MichalPetryka

Copy link
Copy Markdown
Contributor Author

@jkotas Do you know who'd be the right person to review this?

@jkotas

jkotas commented Jul 3, 2026

Copy link
Copy Markdown
Member

This change is not risk-free. --icf=all violates the C/C++ spec guarantees about pointer equality. E.g. from the C23 spec: "Two pointers compare equal if and only if both are null pointers, both are pointers to the same object
(including a pointer to an object and a subobject at its beginning) or function, ...".

We have the equivalent option enabled on Windows, and copilot is not able to find any dependencies on the pointer equality behavior in non-Windows code, so the risk should be acceptable.

@jkotas jkotas merged commit 986fba0 into dotnet:main Jul 3, 2026
153 of 159 checks passed
@jkotas

jkotas commented Jul 3, 2026

Copy link
Copy Markdown
Member

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-Infrastructure community-contribution Indicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants